﻿using System;
using System.Linq;
using System.Web;
using Web.Model;
using NHibernate;
using Web.Extensions;
using System.Web.Mvc;

namespace Web.HelperClasses
{
    public class ProjectNotifier
    {
        private Project project;
        private ISession session;
        private User organizer;

        private const string NewCommentTemplate = @"Уважаемый {0}. <br/>
В обсуждении Вашего проекта <a href='{2}'>{1}</a><br/>
Пользователь <a href='{4}'>{3}</a> добавил комментарий:<br/>
<br/>
{5}<br/>";

        private const string UserAppliedTemplate = @"Уважаемый {0}. <br/>
Пользователь <a href='{2}'>{1}</a> записался на вакансию {3}<br/>
В Вашем проекте '<a href='{5}'>{4}</a>'<br/>";

        private const string UserApprovedTemplate = @"Уважаемый {0}. <br/>
Организатор <a href='{2}'>{1}</a> одобрил вас на вакансию {3}<br/>
В проекте '<a href='{5}'>{4}</a>'<br/>";

        private const string ProjectApprovedTemplate = @"Уважаемый {0}. <br/>
Ваш проект <a href='{2}'>{1}</a> одобрен и открыт для редактирования.<br/>
<br/>
Пожалуйста, пройдите по ссылке и укажите,<br/> 
какие люди вам требуются и что они должны делать.<br/>";

        private const string UpcomingProjectTemplate = @"Уважаемый {0}. <br/>
Не забудьте, что Вы записались в проект <a href='{2}'>{1}</a>.<br/>
<br/>
Проект состоится завтра!<br/>
<br/>
Мы Вас очень ждем.<br/>";

        public ProjectNotifier(int id, ISession session)
        {
            this.session = session;
            project = session.Get<Project>(id);
            if (project == null) throw new InvalidOperationException("Проект не найден");
            organizer = project.Organizer;
            if (organizer == null) throw new InvalidOperationException("Пользователь не найден");
        }
        
        public ProjectNotifier(Project proj, ISession session)
        {
            this.session = session;
            this.project = proj;
            organizer = project.Organizer;
            if (organizer == null) throw new InvalidOperationException("Пользователь не найден");
        }

        public void NotifyNewComment(CommentBase newComment)
        {
            if (organizer.NotifyOrganizerProjectCommented && !String.IsNullOrEmpty(organizer.Email))
            {
                UrlHelper urlHelper = UrlHelperExtensions.GetUrlHelper();
                Notification newNotification = new Notification()
                {
                    Subject = "Новый комментарий к проекту '" + project.Name +"'",
                   // Recipient = organizer,
					Email = organizer.NotificationEmail,
                    Body = String.Format(NewCommentTemplate, 
                        HttpUtility.HtmlEncode(organizer.DisplayName),
                        HttpUtility.HtmlEncode(project.Name),
                        urlHelper.ActionAbsolute("View", "Project", new { Id = project.Id }).AbsoluteUri,
                        HttpUtility.HtmlEncode(newComment.Author.DisplayName),
                        urlHelper.ActionAbsolute("View", "User", new { Id = newComment.Author.Id }).AbsoluteUri,
                        HttpUtility.HtmlEncode(newComment.Text)
                    )
                };
               session.Save(newNotification);
            }
        }

        public void NotifyApplied(Vacancy vacancy, User participant)
        {
            if (organizer.NotifyOrganizerUserApplied && !String.IsNullOrEmpty(organizer.Email))
            {
                UrlHelper urlHelper = UrlHelperExtensions.GetUrlHelper();
                Notification newNotification = new Notification()
                {
                    Subject = "Участник записался на вакансию '" + vacancy.Name + "'",
                    // Recipient = organizer,
					Email = organizer.NotificationEmail,
                    Body = String.Format(UserAppliedTemplate,
                        HttpUtility.HtmlEncode(organizer.DisplayName),
                        HttpUtility.HtmlEncode(participant.DisplayName),
                        urlHelper.ActionAbsolute("View", "User", new { Id = participant.Id }).AbsoluteUri,
                        HttpUtility.HtmlEncode(vacancy.Name),
                        HttpUtility.HtmlEncode(project.Name),
                        urlHelper.ActionAbsolute("View", "Project", new { Id = project.Id }).AbsoluteUri
                    )
                };
                session.Save(newNotification);
            }
        }

        public void NotifyApproved(Vacancy vacancy, User participant)
        {
            if (participant.NotifyParticipantApplicationApproved && !String.IsNullOrEmpty(participant.Email))
            {
                UrlHelper urlHelper = UrlHelperExtensions.GetUrlHelper();
                Notification newNotification = new Notification()
                {
                    Subject = "Участник записался на вакансию '" + vacancy.Name + "'",
                    // Recipient = organizer,
					Email = organizer.NotificationEmail,
                    Body = String.Format(UserApprovedTemplate,
                        HttpUtility.HtmlEncode(participant.DisplayName),
                        HttpUtility.HtmlEncode(organizer.DisplayName),
                        urlHelper.ActionAbsolute("View", "User", new { Id = organizer.Id }).AbsoluteUri,
                        HttpUtility.HtmlEncode(vacancy.Name),
                        HttpUtility.HtmlEncode(project.Name),
                        urlHelper.ActionAbsolute("View", "Project", new { Id = project.Id }).AbsoluteUri
                    )
                };
                session.Save(newNotification);
            }
        }

        public void NotifyProjectApproved()
        {
            if (organizer.NotifyOrganizerIdeaApproved && !String.IsNullOrEmpty(organizer.Email))
            {
                UrlHelper urlHelper = UrlHelperExtensions.GetUrlHelper();
                Notification newNotification = new Notification()
                {
                    Subject = "Ваш проект '" + project.Name + "' одобрен",
                    // Recipient = organizer,
					Email = organizer.NotificationEmail,
                    Body = String.Format(ProjectApprovedTemplate,
                        HttpUtility.HtmlEncode(organizer.DisplayName),
                        HttpUtility.HtmlEncode(project.Name),
                        urlHelper.ActionAbsolute("View", "Project", new { Id = project.Id }).AbsoluteUri
                    )
                };
                session.Save(newNotification);
            }
        }
        public void NotifyUpсoming()
        {
            UrlHelper urlHelper = UrlHelperExtensions.GetUrlHelper();
            string actionUrl = urlHelper.ActionAbsolute("View", "Project", new { Id = project.Id }).AbsoluteUri;
            string encodedProjectName = HttpUtility.HtmlEncode(project.Name);
            foreach (User participant in project.Participants
                .Where(u => u.NotifyParticipantProjectUpcoming
                    &&
                    !String.IsNullOrEmpty(u.Email)
                ))
            {
                Notification newNotification = new Notification()
                {
                    Subject = "Завтра вы участвуете в проекте '" + project.Name + "'!",
                    // Recipient = organizer,
					Email = participant.NotificationEmail,
                    Body = String.Format(UpcomingProjectTemplate,
                        HttpUtility.HtmlEncode(participant.DisplayName),
                        encodedProjectName,
                        actionUrl
                    )
                };
                session.Save(newNotification);
            }
        }
    }
}